home *** CD-ROM | disk | FTP | other *** search
/ A.C.E. 2 / ACE CD 2.iso / FILES / UTILS / PROCAL13.DMS / PROCAL13.adf / Rexx / table.rexx < prev   
OS/2 REXX Batch file  |  1991-12-11  |  6KB  |  160 lines

  1. /* Table                      S. Dicker                 6-Aug-89    */
  2. /*                                                                  */
  3. /*    ARexx program used to construct a table of equally spaced     */
  4. /*  values. Select a range of cells to contain the table and then   */
  5. /*  execute this program. You must supply a starting value for the  */
  6. /*  table. You may also supply the increment between table entries  */
  7. /*  (defaults to 1). Cells in the selected range are filled row by  */
  8. /*  row.                                                            */
  9. /*                                                                  */
  10. /*       Example:  Table 50 5                                       */
  11. /*           Fills the selected range with 50, 55, 60, etc.         */
  12.  
  13. signal on error                 /* Trap host command errors. */
  14.  
  15. arg start_value increment       /* Retrieve command line arguments. */
  16.  
  17. address 'Advantage'             /* Send commands to Advantage. */
  18. options results                 /* Enable return of string results. */
  19.  
  20. if start_value = 0 then         /* If no starting value was supplied,  */
  21.    do                           /*  display an error message and quit. */
  22.       'DrawMessage'
  23.       "You must supply a starting value for the table"
  24.       exit 10
  25.    end
  26.    
  27. if increment = ""  then         /* If no increment was supplied, */
  28.    increment = 1                /*  default to 1.                */   
  29.  
  30. 'Current'                       /* Determine current selected range. */
  31. range = result
  32.  
  33. colon_posn = pos(":",range)     /* Look for colon delimiter in range. */
  34.  
  35. if colon_posn = 0 then          /* If no colon, this is not a range. */
  36.    do                           /*  Set the start and end cells to   */
  37.       start_cell = range        /*   the selected cell.              */
  38.       end_cell = range
  39.    end
  40. else                            /* Otherwise, it is a range. */
  41.    /* Extract the start/end cells from the specified range. */
  42.    do
  43.       start_cell = left(range,colon_posn - 1)
  44.       end_cell   = substr(range,colon_posn + 1)
  45.    end
  46.    
  47. start_column = GetColumn(start_cell)    /* Determine range of columns */
  48. end_column   = GetColumn(end_cell)      /*  to be filled.             */
  49.  
  50. start_row = GetRow(start_cell)          /* Determine range of rows */
  51. end_row   = GetRow(end_cell)            /*  to be filled.          */
  52.  
  53. next_entry = start_value                /* Initialize table entry value. */
  54.  
  55. /* Fill cells with table of values, row by row. */
  56. do rownum = start_row to end_row
  57.    
  58.    column = start_column                /* Reset column pointer.  */
  59.    
  60.    /* Fill all columns in the current row. */
  61.    do until c2d(column) > c2d(end_column)
  62.       /* Build complete cell name from row and column. */
  63.       next_cell = column || rownum
  64.       /* Select the cell to be modified. */
  65.       'SelectCell'                   
  66.          value(next_cell)
  67.       /* Load the value into the cell. */
  68.       'PutCell'
  69.          next_entry
  70.       /* Advance to the next column and table entry. */
  71.       column = NextColumn(column)
  72.       next_entry = next_entry + increment
  73.    end
  74.    
  75. end rownum
  76.       
  77. /* Reselect the original range of cells. */
  78. 'SelectRange'
  79.    value(start_cell)
  80.    value(end_cell)
  81.  
  82. exit                    /* That's all folks! */
  83.  
  84. /* >>> Host command error handler <<< */
  85. Error:
  86.    exit rc                 /* Just bail out and return error code. */
  87.  
  88.  
  89. /* ----------------------------------------------------------------- */
  90. /*            Internal Functions (subroutines)                       */
  91. /* ----------------------------------------------------------------- */
  92.  
  93. /* == GetRow: Extract the row number from a cell name. == */
  94.  
  95. GetRow: procedure
  96.    arg CellName      /* Function expects to be passed a cell name. */
  97.  
  98.    /* Find the first numeric digit in the cell name. */
  99.    start_number = verify(CellName,"0123456789","Match")
  100.    
  101.    /* Extract all characters starting at the first digit and continuing */
  102.    /* to the end of the cell name.                                      */
  103.    rownum = substr(CellName,start_number)
  104.  
  105. return rownum
  106.  
  107. /* == GetColumn: Extract the column label from a cell name. == */
  108.  
  109. GetColumn: procedure
  110.    arg CellName      /* Function expects to be passed a cell name. */
  111.  
  112.    /* Find the first numeric digit in the cell name. */
  113.    start_number = verify(CellName,"0123456789","Match")
  114.    
  115.    /* Extract all characters in the cell name up to the first numeric */
  116.    /* character (start of row number).                                */
  117.    column = left(CellName,start_number-1)
  118.  
  119. return column
  120.  
  121. /* == NextColumn: Given the current column label, determine the label == */
  122. /* ==              for the next sequential column. NOTE: This is a    == */
  123. /* ==              recursive function.                                == */
  124.  
  125. NextColumn: procedure
  126.    arg ThisColumn    /* Function expects to be passed a column label. */
  127.  
  128.    /* If the column label is empty (null string), then we must be */
  129.    /* starting a new group of column labels (for example, going   */
  130.    /* from column ZZ to column AAA. Return an "A".                */
  131.    if length(ThisColumn) = 0 then
  132.       new_column = "A"
  133.    
  134.    /* Otherwise, we must advance the last character in the column */
  135.    /* name to the next sequential alphabetic character.           */
  136.    else
  137.       do
  138.          col_number = ,                 /* Convert last character */
  139.             c2d( right(ThisColumn,1) )  /*  to decimal value.     */
  140.    
  141.          col_number = col_number + 1    /* Increment to next character. */
  142.          new_char = d2c(col_number)     /* Convert back to a character. */
  143.    
  144.          /* If we've gone past 'Z', find the next column for the column */
  145.          /* label minus the last character and then append an "A" to    */
  146.          /* this label (start of a new label set).                      */
  147.          if new_char > "Z" then
  148.             do
  149.                temp_column = left( ThisColumn, length(ThisColumn)-1 )
  150.                new_column = NextColumn(temp_column) || "A"
  151.             end
  152.          
  153.          /* Otherwise, replace the last character of the column label */
  154.          /* with the next sequential character.                       */
  155.          else
  156.             new_column = overlay(new_char,ThisColumn,length(ThisColumn))
  157.       end
  158.  
  159. return new_column
  160.